/*

Path 结构体代表了底层文件系统的文件路径。
Path 分为两种：posix::Path，针对类 UNIX 系统；
windows::Path，针对 Windows。prelude 会选择并输出符合平台类型的 Path 种类

注意 Path 在内部并不是用 UTF-8 字符串表示的，而是存储为若干字节（Vec<u8>）的 vector。
    因此，将 Path 转化成 &str 并非零开销的（free），且可能失败（因此它返回一个 Option
*/

#[cfg(test)]
mod pathx {
    use std::env;
    use std::path::Path;

    #[test]
    fn evn_vars() {
        for x in env::vars() {
            println!("{} {}", x.0, x.1)
        }
        for x in env::vars_os() {
            println!("{:?} {:?}", x.0, x.1)
        }
        println!("{:?} ", env::var("RUSTC"));
        println!("{:?} ", env::var_os("RUSTC"));
    }

    #[test]
    fn base() {
        println!("temp_dir {:?}", env::temp_dir()); //	返回临时目录的路径。
        println!("current_dir {:?}", env::current_dir().unwrap()); //cargo.toml
        println!("current_exe {:?}", env::current_exe().unwrap());

        // println!("GO_HOME {:?}", env::var_os("GO_HOME"));

        /*

        join_paths	为 PATH 环境变量适当地加入 Path 的集合。
        remove_var	从当前正在运行的进程的环境中删除环境变量。
        */
        let path = Path::new("/base/");

        // `display` 方法返回一个可显示（showable）的结构体
        println!("display:{}", path.display());
        // `join` 使用操作系统特定的分隔符来合并路径到一个字节容器，并返回新的路径
        let new_path = path.join("a").join("b");

        // 将路径转换成一个字符串切片
        match new_path.to_str() {
            None => panic!("new path is not a valid UTF-8 sequence"),
            Some(s) => println!("new path is {}", s),
        }
    }
}

/*

========== 新增 pathx：Path 与 PathBuf 使用示例与中文注释 ==========

*/

use std::env;
use std::path::Path;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn env_vars_example() {
        // 打印部分环境变量以演示 env::vars 与 env::vars_os
        for (k, v) in env::vars().take(5) {
            println!("{}={}", k, v);
        }
        for (k, v) in env::vars_os().take(5) {
            println!("{:?}={:?}", k, v);
        }
    }

    #[test]
    fn path_basic_example() {
        // temp_dir/current_dir/current_exe 演示
        println!("temp_dir={:?}", env::temp_dir());
        println!("current_dir={:?}", env::current_dir().unwrap());
        println!("current_exe={:?}", env::current_exe().unwrap());

        let base = Path::new("/base/");
        println!("display={}", base.display());

        let joined = base.join("a").join("b");
        // to_str 返回 Option<&str>，因为路径可能不是有效 UTF-8
        if let Some(s) = joined.to_str() {
            println!("joined path = {}", s);
        } else {
            println!("joined path is not valid UTF-8");
        }
    }
}
